---
title: Пользовательская аутентификация
description: Подключитесь к вашей собственной бекэнд-системе аутентификации
---

# Пользовательская аутентификация

## Подключитесь к вашей собственной бекэнд-системе аутентификации

Хотя RainbowKit предоставляет [первоклассную поддержку Sign-In с Ethereum и NextAuth,](/docs/authentication#set-up-sign-in-with-ethereum-and-nextauth) вы также можете интегрироваться с пользовательскими бекэндами и форматами сообщений.

### Создание пользовательского адаптера

Сначала создайте адаптер аутентификации. Это позволит RainbowKit создавать/подготавливать сообщения и общаться с вашим бекэндом.

Например, мы могли бы сделать адаптер аутентификации, позволяющий использовать [Sign-In с Ethereum](https://login.xyz) против некоторых пользовательских API-эндпоинтов, таких как [iron-session](https://github.com/rainbow-me/rainbowkit/tree/main/examples/with-next-siwe-iron-session).

```tsx
import { createAuthenticationAdapter } from '@rainbow-me/rainbowkit';
import { createSiweMessage } from 'viem/siwe';

const authenticationAdapter = createAuthenticationAdapter({
  getNonce: async () => {
    const response = await fetch('/api/nonce');
    return await response.text();
  },

  createMessage: ({ nonce, address, chainId }) => {
    return createSiweMessage({
      domain: window.location.host,
      address,
      statement: 'Sign in with Ethereum to the app.',
      uri: window.location.origin,
      version: '1',
      chainId,
      nonce,
    });
  },

  verify: async ({ message, signature }) => {
    const verifyRes = await fetch('/api/verify', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ message, signature }),
    });

    return Boolean(verifyRes.ok);
  },

  signOut: async () => {
    await fetch('/api/logout');
  },
});
```

#### Предоставление состояния аутентификации

Предполагая, что ваше приложение уже управляет жизненным циклом аутентификации, вы можете передать текущий статус аутентификации вместе с вашим пользовательским адаптером в `RainbowKitAuthenticationProvider`, обернув ваш существующий `RainbowKitProvider`.

```tsx
import {
  createAuthenticationAdapter,
  RainbowKitAuthenticationProvider,
  RainbowKitProvider,
} from '@rainbow-me/rainbowkit';
import { AppProps } from 'next/app';
import { WagmiProvider } from 'wagmi';
import {
  QueryClientProvider,
  QueryClient,
} from "@tanstack/react-query";

const authenticationAdapter = createAuthenticationAdapter({
  /* See above... */
});

const queryClient = new QueryClient();

export default function App({ Component, pageProps }: AppProps) {
  // You'll need to resolve AUTHENTICATION_STATUS here
  // using your application's authentication system.
  // It needs to be either 'loading' (during initial load),
  // 'unauthenticated' or 'authenticated'.

  return (
    <WagmiProvider {...etc}>
      <QueryClientProvider client={queryClient}>
        <RainbowKitAuthenticationProvider
          adapter={authenticationAdapter}
          status={AUTHENTICATION_STATUS}
        >
          <RainbowKitProvider {...etc}>
            <Component {...pageProps} />
          </RainbowKitProvider>
        </RainbowKitAuthenticationProvider>
      </QueryClientProvider>
    </WagmiProvider>
  );
}
```

Если вы дошли до этого момента и создали адаптер для существующей библиотеки аутентификации с открытым исходным кодом, пожалуйста, рассмотрите возможность создания пакета чтобы другие могли им пользоваться!
